#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

// Wi-Fi 配置
const char *ssid = "TP-LINK_1A24";         // 填入自己的wifi
const char *password = "125385537.fishV"; //

// DeepSeek API 配置
const char *apiUrl = "https://api.deepseek.com/v1/chat/completions"; //  DeepSeek API 的聊天端点
const char *apiKey = "sk-87d6f020c8b148468a4ef3b3bae1c90b";          // 替换为你的 API Key，现在可免费注册

// 全局变量
String userInput = ""; // 存储用户输入

void parseResponse(const String &response)
{
    // 找到第一个换行符的位置
    int newlineIndex = response.indexOf("\r\n");

    if (newlineIndex != -1)
    {
        // 提取16进制长度字符串
        String hexLengthStr = response.substring(0, newlineIndex);
        int jsonLength = strtol(hexLengthStr.c_str(), nullptr, 16);

        // 计算JSON数据的起始位置
        String jsonData = response.substring(newlineIndex + 2);

        if (jsonData.length() >= jsonLength)
        {
            // 提取完整的JSON数据
            String jsonResponse = jsonData.substring(0, jsonLength);

            // 解析JSON
            JsonDocument doc;
            //StaticJsonDocument<2048> doc;
            DeserializationError error = deserializeJson(doc, jsonResponse);
            if (error)
            {
                Serial.print("JSON 解析失败: ");
                Serial.println(error.c_str());
            }
            else
            {
                Serial.println("JSON 解析成功:");
                // 获取 content 字段的值
                const char *content = doc["choices"][0]["message"]["content"];

                // 输出 content 字段的内容
                Serial.print("Content: ");
                Serial.println(content);
            }
        }
        else
        {
            Serial.println("JSON 数据长度不足");
        }
    }
    else
    {
        Serial.println("未找到16进制长度");
    }
}

// 发送请求到 DeepSeek API
void sendRequest(String userInput)
{
    HTTPClient http;
    http.begin(apiUrl);
    http.addHeader("Content-Type", "application/json");
    http.addHeader("Authorization", "Bearer " + String(apiKey));
    http.setTimeout(10000); // 设置超时时间为 10 秒

    // 构建请求体
    String jsonData = "{\"model\":\"deepseek-chat\",\"messages\":[{\"role\":\"user\",\"content\":\"" + userInput + "\"},{\"role\":\"system\",\"content\":\"you are my girlfriend,and your name is lisa\"} ]}";
    Serial.println("请求体: " + jsonData); // 打印请求体

    int httpResponseCode = http.POST(jsonData);

    if (httpResponseCode > 0)
    {

        Serial.println("API 响应状态码: " + String(httpResponseCode)); // 打印状态码

        // // 打印响应头
        // for (int i = 0; i < http.headers(); i++)
        // {
        //     Serial.println(http.headerName(i) + ": " + http.header(i));
        // }

        // 流式读取响应体
        WiFiClient *stream = http.getStreamPtr();
        if (stream)
        {
            String response;
            unsigned long startTime = millis();
            unsigned long timeout = 10000; // 整体超时 10 秒

            unsigned long noDataStartTime = 0;
            int noDataCount = 0;
            const int noDataThreshold = 10;           // 连续无数据10次
            const unsigned long noDataMaxTime = 1000; // 无数据最大等待时间 1s

            bool hasReceivedData = false; // 标记是否曾经接收到数据

            while (stream->connected())
            {
                if (millis() - startTime > timeout)
                {
                    Serial.println("整体读取超时");
                    break;
                }

                if (stream->available())
                {
                    char c = stream->read();
                    response += c;
                    Serial.print(c);

                    hasReceivedData = true; // 记录已经接收到数据
                    startTime = millis();   // 重新计时
                    noDataCount = 0;        // 清空无数据计数
                    noDataStartTime = 0;    // 重置无数据开始时间
                }
                else if (hasReceivedData)
                { // **必须收到数据后，才开始监测无数据**
                    if (noDataStartTime == 0)
                    {
                        noDataStartTime = millis(); // 记录无数据的起始时间
                    }

                    noDataCount++; // 记录连续无数据的次数

                    // 如果连续10次无数据，且时间超过1秒，退出循环
                    if (noDataCount >= noDataThreshold && (millis() - noDataStartTime) >= noDataMaxTime)
                    {
                        Serial.println("超过1秒无数据，退出循环");
                        break;
                    }

                    delay(10); // 短暂等待，减少CPU占用
                }
            }

            // 解析完整的响应
            if (!response.isEmpty())
            {
                parseResponse(response);
            }
            else
            {
                Serial.println("API 响应体为空");
            }
        }
        else
        {
            Serial.println("无法获取响应流");
        }
    }
    else
    {
        Serial.println("请求失败，错误代码: " + String(httpResponseCode));
        Serial.println("错误信息: " + http.errorToString(httpResponseCode));
    }

    http.end();
}

void setup()
{
    Serial.begin(115200); // 波特率115200，烧录完程序后不用拔出，按rts后连接串口助手即可

    // 连接 Wi-Fi
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(1000);
        Serial.println("连接 Wi-Fi...");
    }
    Serial.println("Wi-Fi 连接成功");

    // 提示用户输入
    Serial.println("请输入内容，然后按回车键发送：");
}

void loop()
{
    // 检查用户输入
    if (Serial.available())
    {
        userInput = Serial.readStringUntil('\n'); // 读取用户输入
        userInput.trim();                         // 去除多余的空格和换行符
        Serial.println("用户输入: " + userInput);

        // 发送请求到 DeepSeek API
        if (WiFi.status() == WL_CONNECTED)
        {
            sendRequest(userInput);
        }
        else
        {
            Serial.println("Wi-Fi 未连接");
        }

        // 清空用户输入
        userInput = "";
    }
}
